不要用 let's encrypt 作为 flutter 的服务端证书
在中国大陆,不要使用 let's encrypt 作为 flutter 应用的服务端证书。
起因
几天前更新了 triplan 的 1.2.3 版本,收到了大量 iOS 用户的反馈:卡顿太夸张。与此同时未收到 Android 用户有关卡顿的反馈。更奇怪的是,卡顿现象貌似只出现在发起网络请求之后。这里我使用的是网络请求库 dio。一开始以为是代码优化做的不够好,或者是服务器请求过多造成线程阻塞,于是将注意力放在代码优化和服务端负载均衡上。
问题来源
后来 v2ex 网友帮我找到了原因:服务端使用了 let's encrypt 颁发的证书。
随后我在 github 上找到一些 issue (flutterchina/dio#703、dart-lang/sdk#41519、flutter/flutter#49392),这些 issue 的报告者大部分是中国人。
目前基本上可以断定是证书的问题。iOS 通过地址 ocsp.int-x3.letsencrypt.org 给 let's encrypt 做 OCSP 联网验证,而该地址在国内无法访问从而导致卡顿。由于谷歌不 care OCSP,在 Android 下不需要进行 OCSP 联网验证从而不会卡顿。
在线证书状态协议 OCSP
在线证书状态协议(Online Certificate Status Protocol, OCSP),是一个用于获取 X.509 数字证书撤销状态的网际协议,在 RFC 6960 中定义,作为证书吊销列表(CRL)的替代品解决了在公开密钥基础建设(PKI)中使用证书吊销列表而带来的多个问题。协议数据传输过程中使用 ASN.1 编码,并通常创建在 HTTP 协议上,此消息类型分为“请求消息”和“响应消息”,因此致 OCSP 服务器被称为“OCSP响应端”。
通俗来讲,在 TLS 的使用中,客户端无法判断一个证书是否被吊销。因此客户端需要通过一个服务端接口来判断手上的证书是否过期、是否被吊销等。
解决方法
更换证书。目前已将 triplan 的服务端证书更换为 TrustAsia。
雁过留痕,风过留声